// Darwin 系统的直接 IO 实现

package turbocopy

import (
	"fmt"
	"os"
	"syscall"
)

const (
	// OSX 不需要任何对齐
	AlignSize = 0

	// 最小块大小
	BlockSize = 4096
)

func OpenFile(name string, flag int, perm os.FileMode) (file *os.File, err error) {
	file, err = os.OpenFile(name, flag, perm)
	if err != nil {
		return
	}

	// 设置 F_NOCACHE 以避免缓存
	// F_NOCACHE    打开/关闭数据缓存。arg 中的非零值关闭数据缓存。arg 中的
	//              零值打开数据缓存。
	_, _, e1 := syscall.Syscall(syscall.SYS_FCNTL, uintptr(file.Fd()), syscall.F_NOCACHE, 1)
	if e1 != 0 {
		err = fmt.Errorf("设置 F_NOCACHE 失败: %s", e1)
		file.Close()
		file = nil
	}

	return
}
